package CAS;

import java.util.concurrent.atomic.AtomicReference;

/**
 * @program: javase
 * @description: 使用CAS模拟不可重入锁
 * @author: luolidong
 * @create: 2021-06-16 16:20
 * @version: 1.0
 */
/**
 自旋锁（spinlock）：是指当一个线程在获取锁的时候，如果锁已经被其它线程获取，
 那么该线程将循环等待，然后不断的判断锁是否能够被成功获取，直到获取到锁才会退出循环。

 获取锁的线程一直处于活跃状态，但是并没有执行任何有效的任务，使用这种锁会造成busy-waiting。
*/
public class NoReentrantLockByCAS {
    //使用原子引用对象保存对象，确保原子性
    private final AtomicReference<Thread> lockedThread=new AtomicReference<>();

    public void lock(){
//        获取当前线程
        Thread thread = Thread.currentThread();
        while (!lockedThread.compareAndSet(null, thread)){
            //自旋，直到当前线程释放，其他线程才能获取
        }
    }
    public void unlock(){
        lockedThread.compareAndSet(Thread.currentThread(), null);
    }
}
